<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="../../../src/base/_core.js"></script>
    <script type="text/javascript" src="../../../src/base/function.js"></script>
</head>
<body>
<script type="text/javascript">
    //bind
    var obj = {
        VER:0.1,
        getVer:function (prefix) {
            return (prefix || 'ver-') + this.VER;
        }
    };
    function xyz(callback) {
        return callback();
    }
    //var ver=xyz(obj.getVer.call(obj,'afeiVer-'));
    //var ver=xyz(obj.getVer.bind(obj,'afeiVer-'));
    /**
     * Bind方法详解
     */
    var x = 9,
            module = {
                getX:function (y) {
                    return this.x + (y || 1);
                },
                x:81
            };
    //显式作用域
    console.log('01-:', module.getX(2));
    //在这种情况下调用会出问题
    /**
     * 这里通过断点，可以得到this.x中的this为window
     * @type {Function}
     */
    var GetX = module.getX;
    console.log('02-:', GetX(2));
    //在es5里Function.prototype上有个bind方法
    //bind用法如下bind(fn,arg1,arg1,arg2...)
    var GetX2 = module.getX.bind(module);
    console.log('03-:', GetX2(2));
    /**
     * 在其它的不支持bind浏览器里实现bind方法
     */
    function bind(fn, context) {
        var slice = Array.prototype.slice;
        /*var fn=shift.call(arguments);
         var context=shift.call(arguments);
         var args=arguments;*/
        /*var fn=arguments[0];
         var context=arguments[1];
         var args=slice.call(arguments,2);
         console.log('typeof :',typeof args);
         console.log('instanceof ',args instanceof Array);//Array
         console.log('args ',args);  //[2]*/
        //var args=Array.prototype.slice.call(arguments,2);
        if (Function.prototype.bind) {
            //return fn.bind(context,args);//arg1,arg2
            return Function.prototype.bind.apply(fn, slice.call(arguments, 1));
        } else {
            var args = slice.call(arguments, 2);
            return function () {
                var array = slice.call(arguments, 0);
                return fn.apply(context, args.concat(array));
            }
        }
    }
    /**
     * 测试一下自己写的bind方法
     */
    var GetX4 = bind(module.getX, module, 9);
    console.log('04-:', GetX4());
    /**
     * 优化得到如下 ：
     */
    var ln = {
        bind:(function () {
            var nativeBind = Function.prototype.bind,
                slice=Array.prototype.slice;
            return nativeBind ? function (fn, context) {
                return Function.prototype.bind.apply(fn, slice.call(arguments, 1));
            } : function (fn, context) {
                if (arguments.length < 2 && context===undefined) return fn;
                var args = slice.call(arguments, 2);
                return function () {
                    var inArgs = slice.call(arguments, 0);
                    return fn.apply(context, args.concat(inArgs));
                }
            }
        }())
    };
    function bind2(fn, context) {
        var slice = Array.prototype.slice;
        if (Function.prototype.bind) {
            //return fn.bind(context,args);//arg1,arg2
            return Function.prototype.bind.apply(fn, slice.call(arguments, 1));
        } else {
            var args = slice.call(arguments, 2);
            return function () {
                var array = slice.call(arguments, 0);
                return fn.apply(context, args.concat(array));
            }
        }
    }


</script>
</body>
</html>